package gybase04

/**
 ********************************************************
 * Author: chinadragon
 * Time: 2021/12/26 下午9:04
 * 注入
 * Overview:
 * Usage:
 ********************************************************
 */
class PesonMop3 {
    def func() {
//        println" i hava a dream"
        System.out.println(" PesonMop3 i hava a dream")
    }
}

println "PesonMop3.metaClass 注入前 ：" + PesonMop3.metaClass
//PesonMop3.metaClass 注入前 ：org.codehaus.groovy.runtime.HandleMetaClass@48f5bde6[groovy.lang.MetaClassImpl@48f5bde6[class gybase04.PesonMop3]]

def pesonMop3 = new PesonMop3()

//注入
PesonMop3.metaClass.funtest = {//如果方法不存在，会自动添加

    println "funtest 调用"
}
println "PesonMop3.metaClass 注入后 ：" + PesonMop3.metaClass
//PesonMop3.metaClass 注入后 ：groovy.lang.ExpandoMetaClass@77b7ffa4[class gybase04.PesonMop3]

//pesonMop3.funtest()
//funtes t 调用

//使用 groovy.lang.ExpandoMetaClass 注入
def emc = new ExpandoMetaClass(PesonMop3)
emc.funexpand {
    println "funexpand 调用"

}
emc.initialize()
PesonMop3.metaClass = emc

new PesonMop3().funexpand()
//funexpand 调用


//使用分类注入方法 use
class StringUtils {
    static def isEmpty(String self) {
        println "调用 StringUtils isEmpty "
        self == null || self.length() == 0
    }

    static def isNotEmpty(String self) {
        println "调用 StringUtils isNotEmpty "
        self != null && self.length() > 0
    }
}

use(StringUtils) {
    println "".isEmpty()
    println "".isNotEmpty()
}

//调用 StringUtils isEmpty
//true
//调用 StringUtils isNotEmpty
//false


class StringUtils2 {
    static def isEmpty(String self) {
        println "调用 StringUtils2 isEmpty "
        self == null || self.length() == 0
    }

    static def isNotEmpty(Integer self) {//参数类型改变了
        println "调用 StringUtils2 isNotEmpty "
        self != null
    }
}

use(StringUtils, StringUtils2) {//这里会先从后面对类开始找，注意方法里对参数类型
    println "".isEmpty()
    println "".isNotEmpty()
    println 123.isNotEmpty()
}
//调用 StringUtils2 isEmpty
//true
//调用 StringUtils isNotEmpty
//false
//调用 StringUtils2 isNotEmpty
//true

//使用分类注入方法2 use
@Category(String)
class StringUtils3 {
    def isEmpty() {//这里不需要 static 以及方法里面 参数
        println "调用 StringUtils3 isEmpty "
        this == null || this.length() == 0
    }

}

use(StringUtils3) {
    println "".isEmpty()

}

//-----------------------------------------------------
// 运算符重载

class TestAA {
    def plus(TestAA newTestAA) {
        //处理业务
    }
}

new TestAA() + new TestAA()//点击加号直接跳到 plus 方法

Integer.metaClass.plus = {
   int a ->
        "$delegate + $a"
}

println 1 +2
//1 + 2

//Expando 动态生成类
def e = new Expando(name:"AZ",func:{
    println"调用 了func"
})
println e.name
e.func()
//AZ
//调用 了func

e.ad = 12
println e.ad
//12
